'use strict';
import { JsonWebTokenError } from 'jsonwebtoken'

export default () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      // ctx.app.emit('error', err, ctx);

      if (err && err.status === 304) {
        ctx.status = 304;
        return
      }

      console.log('err --> ', err)

      let code = err.code || 1;
      const status =  200
      let msg = ''
      let other = err ? err.other : ''
      // token 失效
      if (err instanceof JsonWebTokenError) {
        code = 401
        msg = '登录超时，请重新登录'
      } else {
        switch (code) {
          case 'invalid_param':
            const [oneErr] = err.errors
            const { field, code, message } = oneErr
            msg = `【${field}】${code}  ${message}`
            break
          default:
            msg = typeof err === 'string' ? err : err.msg || err.errmsg || err.message
        }
      }

      // 从 error 对象上读出各个属性，设置到响应中
      ctx.body = {
        code,
        msg,
        other
      };
      ctx.status = status;
    }
  };
};
